package threshold;

import java.util.Stack;

/**
 * @Author wujiaming
 * @Description TODO
 * @Date 2023-03-02 15:30
 * @Version 1.0
 */
public class IsValid {

    /**
     * 要考虑特殊情况，字符串为空的情况，整个字符串一个一种的情况
     * @param s
     * @return
     */
    public boolean isValid(String s) {
        Stack<Character> strs = new Stack<>();

        //如果是空字符串直接返回真
        if(s.length()==0){
            return true;
        }

        for (int i = 0; i <s.length() ; i++) {
            //如果是左括号那个直接入栈,入栈之后结束本次循环执行下一次循环
            if(s.charAt(i)=='('||s.charAt(i)=='['||s.charAt(i)=='{'){
                strs.push(s.charAt(i));
                continue;
            }else{
                //如果是有括号，则弹栈与有括号匹配
                //注意这里有一种特殊情况就是只有有括号的时候，所括号没有被匹配到说明栈空则不配
               if(strs.isEmpty() ||!isMatch(strs.pop(),s.charAt(i))){
                   return false;
               }
            }

        }

        //最后匹配的条件时栈空
        return strs.isEmpty();
    }

    /**
     * switch case用于解决选着问题，用于实现键值对，也可以实现是否匹配问题
     * @param left
     * @param right
     * @return
     */
    public boolean isMatch(char left,char right){
        switch (right){
            case ')':return left=='(';
            case '}':return left=='{';
            case ']':return left=='[';
            default:return false;
        }
    }

    public static void main(String[] args) {
        IsValid isValid = new IsValid();
        String s = "){";
        System.out.println(isValid.isValid(s));

    }
}
